package com.cskaoyan.javase.swing.manager.stage2.controller.impl;

import com.cskaoyan.javase.swing.manager.stage2.controller.StudentController;
import com.cskaoyan.javase.swing.manager.stage2.dao.StudentDao;
import com.cskaoyan.javase.swing.manager.stage2.dao.impl.StudentDaoImpl;
import com.cskaoyan.javase.swing.manager.stage2.model.Student;

/**
 * 与学生信息相关的,业务操作的具体实现
 * @since 19:30
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class StudentControllerImpl implements StudentController {

    // 业务处理需要获取数据,所以需要依赖数据处理层
    private StudentDao studentDao = new StudentDaoImpl();

    /**
     * Swing GUI表格需要的表格数据data是一个String类型的二维数组,
     *      所以需要封装出二维数组
     * @since 9:19
     * @return java.lang.String[][] 作为GUI表格的数据data
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    @Override
    public String[][] getAllTableData() {
        // 获取数据
        Student[] realStudents = studentDao.getRealStudents();
        return get2DStrArrByStudentArr(realStudents);
    }

    /**
     *  Swing GUI表格需要的表格列是一个String数组
     * @since 9:20
     * @return java.lang.String[]
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    @Override
    public String[] getTableColumns() {
        return studentDao.getTableColumns();
    }

    /**
     * 检查id是否重复,true表示重复,否则为不重复
     * @since 18:11
     * @param id 学生id
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    @Override
    public boolean checkStuIdRepeat(String id) {
        if (id == null || "".equals(id)) {
            // 若输入的id不存在,效果等同于重复,禁止插入
            return true;
        }
        return studentDao.checkStuIdRepeat(id);
    }

    /**
     * 导入一条学生信息，true表示成功，否则为失败
     * 由于已经判定过很多次了，所以失败只有一种可能，即数组满了
     * @since 14:21
     * @param stu GUI界面输入的学生对象
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    @Override
    public boolean addStudent(Student stu) {
        if (stu == null) {
            // 传入null，直接算插入失败
            return false;
        }
        return studentDao.addStudent(stu);
    }

    /**
     * 将一个学生对象数组转换成表格需要的数据,即该学生对象数组长度的一个二维数组
     * @since 12:21
     * @param stus 目标学生数组
     * @return java.lang.String[][]
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    private String[][] get2DStrArrByStudentArr(Student[] stus) {
        // 获取结果二维数组的长度
        String[][] result = new String[stus.length][];
        // 遍历二维数组并赋值
        /*
            赋值很简单,因为这个二维数组的长度一定是学生数组的长度
            并且每个String数组的长度一定是表格的列数,也是固定的
            每个String数组的内容也是固定的
         */
        for (int i = 0; i < result.length; i++) {
            Student aStu = stus[i];
            result[i] = new String[]{
                    aStu.getStuId(), aStu.getName(), aStu.getGender(), aStu.getSchool(), aStu.getMajor(), aStu.getAge(), aStu.getCity(), aStu.getPhone(), aStu.getEmail()};
        }
        return result;
    }

}
